import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.queryParser.QueryParser.Operator;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.Query;


public class QueryConstructor {

	private static final String titulo = "filename";
	private static final String contenido = "contents";

	String texto;
	boolean exacta; //busqueda exacta
	boolean todas ; //busqueda de todas los terminos
	boolean sin ; //busqueda sin los terminos
	int campos ; //0 si se busca en el titulo, 1 para el contendio y 2 para ambos o si no hay seleccion
	
	private StandardAnalyzer analyzer; //analizador
	
	public QueryConstructor(StandardAnalyzer analizador){
		this.analyzer = analizador;
	}
	
	public void setTexto(String text){
		texto = text;
	}
	
	public void setExacta(boolean valor){
		exacta = valor;
	}
	
	public void setTodas(boolean valor){
		todas = valor;
	}
	
	public void setSin(boolean valor){
		sin = valor;
	}
	
	public void setCampos(int valor){
		campos = valor;
	}
	
	public void reset(){
		exacta = false;
		todas = false;
		sin = false;
		campos = 2;
	}
	
	public Query construirQuery() throws ParseException{
		PhraseQuery p = new PhraseQuery();
		PhraseQuery p2 = new PhraseQuery();
		Query q = null;
		Query q2 = null;
		QueryParser parser;
		Token[] t;
		
		if (exacta){
		
			switch (campos){
			case(0):
				parser = new QueryParser(titulo, this.analyzer);
				texto = "\""+texto+"\"";
				q = parser.parse(texto);
				System.out.print(q.toString()+"\n");
				break;
				
			case (1):
				parser = new QueryParser(contenido, this.analyzer);
				texto = "\""+texto+"\"";
				q = parser.parse(texto);
				System.out.print(q.toString()+"\n");
				break;
				
			case (2):
				texto = "\""+texto+"\"";
				String[] querys = {texto,texto};
				String[] fields = {titulo, contenido};
				BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD,BooleanClause.Occur.SHOULD};
				q = MultiFieldQueryParser.parse(querys, fields, flags, analyzer);
				System.out.print(q.toString()+"\n");
				break;
			}
			return q;
		}
		else{
			if (todas){
				switch (campos){
				case(0):
					parser = new QueryParser(titulo, this.analyzer);
					parser.setDefaultOperator(Operator.AND);
					q = parser.parse(texto);
					System.out.print(q.toString()+"\n");
					break;
				case (1):
					parser = new QueryParser(contenido, this.analyzer);
					parser.setDefaultOperator(Operator.AND);
					q = parser.parse(texto);
					System.out.print(q.toString()+"\n");
					break;
				case (2):
					parser = new QueryParser(contenido,this.analyzer);
					parser.setDefaultOperator(Operator.AND);
					q = parser.parse(texto);
					System.out.print(q.toString()+"\n");
					break;
				}
				return q;
			}
			else
			{
				if (sin){
					String[] querys_sin = {texto};
					String[] fields_sincontenido = {contenido};
					String[] fields_sintitulo = {titulo};
					BooleanClause.Occur[] flags_sin = {BooleanClause.Occur.MUST_NOT};
					switch (campos){
					case(0):
						parser = new QueryParser(titulo, this.analyzer);
						texto = "-"+texto;
						q = parser.parse(texto);
						System.out.print(q.toString()+"\n");
						break;
					case (1):
						parser = new QueryParser(contenido, this.analyzer);
						texto = "-"+texto;
						q = parser.parse(texto);
						System.out.print(q.toString()+"\n");
						break;
					case (2):
						parser = new QueryParser(contenido,this.analyzer);
						texto = "-"+texto;
						q = parser.parse(texto);
						System.out.print(q.toString()+"\n");
						break;
					}
					return q;
				}
				else
				{
					String[] querys = {texto,texto};
					String[] querys2 = {texto};
					String[] fields = {titulo, contenido};
					String[] fields2 = {contenido};
					String[] fields3 = {titulo};
					BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD,BooleanClause.Occur.SHOULD};
					BooleanClause.Occur[] flags2 = {BooleanClause.Occur.SHOULD};
					
					switch (campos){
					case(0):
						q = MultiFieldQueryParser.parse(querys2, fields3, flags2, analyzer);
						break;
					case (1):
						q = MultiFieldQueryParser.parse(querys2, fields2, flags2, analyzer);
						break;
					case (2):
						q = MultiFieldQueryParser.parse(querys, fields, flags, analyzer);
						break;
					}
					System.out.print(q.toString()+"\n");
					return q;
				}
			}
		}
	}
}
